/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxServidorTcp;

import BioHuella.BioHuella;
import BioRostro.BioRostro;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import pkg1ifxArchivos.cifxLogs;
import pkg1ifxClienteTcp.caAppsBots;

/**
 *
 * @author strailaparicio
 */
public class caServidor extends cIfxServidor{
    
    //Aqui se agrega lafuncionalidad para manejar conexiones a otros servidores
    //cifxLogs olog = new cifxLogs();
    private static BioRostro Rostro;
    private static BioHuella Huella;
    private caAppsBots appsbots= null;
    private boolean isadirector=true;

    public caAppsBots getAppsBots()
    {
        return appsbots;
    }
    protected caClientesCon[] oclientesconCA = new caClientesCon[0];
    protected caClientesCon[] oagentesTMPCA;
    
    /***
     * Constructor de caServidor
     * @param npuerto , el
     * @param log
     * @throws IOException 
     */
    public caServidor(int npuerto,boolean adirector,cifxLogs log) throws IOException
    {
        super(npuerto, log);
        isadirector=adirector;
        if(isadirector)
            appsbots=new caAppsBots(olog);
        else
        {

            try{
                olog.outMensaje("AppBots.Licenciamiento: Cargando Licencias de Rostro: "+npuerto);
                boolean licRos = false, licHuell = false;
                try{
                    Rostro =  new BioRostro(ninicioRostro,nfinalRostro,olog);
                    licRos = true;
                }catch(Exception e1){
                    olog.outMensaje("AppBots.Licenciamiento: Error en las licencias de Rostro: "+e1);
                }
                olog.outMensaje("AppBots.Licenciamiento: Cargando Licencias de Huella: ");
                try{
                    Huella =  new BioHuella(ninicioHuella,nfinalHuella,olog);
                    licHuell = true;
                }catch(Exception e2){
                    olog.outMensaje("AppBots.Licenciamiento: Error en las licencias de Huella: "+e2);
                }
                if(licHuell && licRos){
                    olog.outMensaje("AppBots.Licenciamiento: Carga Exitosa de  licencias, Templates cargados Exitosamente");
                }else{
                    olog.outMensaje("AppBots.Licenciamiento: Error licenciamiento, Problemas al cargar los Templates");
                }
            }catch(Exception em){
                olog.outMensaje("AppBots.Licenciamiento: Error licenciamiento, Problemas al cargar las licencias");
            }
        }
    }

    private int nMatchingTreshold=93;
    public void setMatchingTreshold(int dato)
    {
        nMatchingTreshold=dato;
        Rostro.setMatchingTreshold(nMatchingTreshold);
        Huella.setMatchingTreshold(nMatchingTreshold);
    }

    public caServidor(int npuerto,int minicioH,int mfinalH,int minicioR,int mfinalR,cifxLogs log) throws IOException
    {
        super(npuerto, log);
        isadirector=false;
        if(isadirector)
            appsbots=new caAppsBots(olog);
        else
        {

            try{
                ninicioHuella=minicioH;
                nfinalHuella=mfinalH;
                ninicioRostro=minicioR;
                nfinalRostro=mfinalR;
                olog.outMensaje("AppBots.Rangos: --------------------------------------------------------------");
                olog.outMensaje("AppBots.Rangos: INICIO HUELLAS: "+ninicioHuella);
                olog.outMensaje("AppBots.Rangos: FINAL HUELLAS: "+nfinalHuella);
                olog.outMensaje("AppBots.Rangos: INICIO ROSTROS: "+ninicioRostro);
                olog.outMensaje("AppBots.Rangos: FINAL ROSTROS: "+nfinalRostro);
                olog.outMensaje("AppBots.Rangos: --------------------------------------------------------------");

                olog.outMensaje("AppBots.Licenciamiento: Cargando Licencias de Rostro: "+npuerto);
                boolean licRos = false, licHuell = false;
                try{
                    Rostro =  new BioRostro(ninicioRostro,nfinalRostro,olog);
                    //Rostro.setMatchingTreshold(nMatchingTreshold);
                    licRos = true;
                }catch(Exception e1){
                    olog.outMensaje("AppBots.Licenciamiento: Error en las licencias de Rostro: "+e1);
                }
                olog.outMensaje("AppBots.Licenciamiento: Cargando Licencias de Huella: ");
                try{
                    Huella =  new BioHuella(ninicioHuella,nfinalHuella,olog);
                    //Huella.setMatchingTreshold(nMatchingTreshold);
                    licHuell = true;
                }catch(Exception e2){
                    olog.outMensaje("AppBots.Licenciamiento: Error en las licencias de Huella: "+e2);
                }
                if(licHuell && licRos){
                    olog.outMensaje("AppBots.Licenciamiento: Carga Exitosa de  licencias, Templates cargados Exitosamente");
                }else{
                    olog.outMensaje("AppBots.Licenciamiento: Error licenciamiento, Problemas al cargar los Templates");
                }
            }catch(Exception em){
                olog.outMensaje("AppBots.Licenciamiento: Error licenciamiento, Problemas al cargar las licencias");
            }
        }
    }
    public BioRostro getRostro(){
        return Rostro;
    }

    public BioHuella getHuella(){
        return Huella;
    }

    @Override
    public void run() {
        Socket onuevoskt=null;
        
        //int nindice=0;
        
        try
        {
          serversocket = new ServerSocket(npuerto);

        }catch(IOException ioe)
        {
            //System.err.println("001IFX-Error (No puedo abri el puerto"+npuerto+")");
            olog.outMensaje("caServidor.run(): ERROR No puedo abrir el puerto :"+npuerto);
            olog.outMensaje("caServidor.run(): ERROR IOException :"+ioe.getMessage());
            System.exit(-1);
        }

        //this.ofrmgral = ofrmppal;
        //ofrmgral.setIconRed(3);
        try {
            while(conectado)
            {

                    //new cIfxClientesCon(serversocket.accept(),ofrmppal).start();
                onuevoskt= serversocket.accept();
                //Asigno un time out de 10 segundos a las conexiones
                onuevoskt.setSoTimeout(ntimeout);
                activarConexionCliente(onuevoskt);

               
            }
            if(serversocket != null)
                serversocket.close();
        } 
        catch(SocketTimeoutException tex)
        {
            olog.outMensaje("caServidor.run(): Time out :"+tex.getMessage());
        }
        catch (IOException ex) {
                //Logger.getLogger(cIfxServidor.class.getName()).log(Level.SEVERE, null, ex);
            olog.outMensaje("caServidor.run(): ERROR IOException :"+ex.getMessage());
        }
        catch(Exception err)
        {
            olog.outMensaje("caServidor.run(): ERROR Exception :"+err.getMessage());
        }
    }
    
    //Strail
    //Para los appbots se deben usar los rangos
    private int ninicioHuella=0;
    private int nfinalHuella =-1;
    public void setRangoHuella(int minicio, int mfinal)
    {
        ninicioHuella=minicio;
        nfinalHuella=mfinal;
    }

    //Strail 01feb2012
    //Se dividen los rangos para huella y rostro respectivamente

    private int ninicioRostro=0;
    private int nfinalRostro =-1;
    public void setRangoRostro(int minicio, int mfinal)
    {
        ninicioRostro=minicio;
        nfinalRostro=mfinal;
    }
    private synchronized void activarConexionCliente(Socket onuevoskt)
    {
        try
        {
            cIfxClientesCon[] occontmp=new cIfxClientesCon[0];
            occontmp=new cIfxClientesCon[oclientesconCA.length];
            CopiarArregloCon(occontmp,oclientesconCA);
            //occontmp= CopiarArregloCon(oclientesconCA); 

            oclientesconCA=new caClientesCon[oclientesconCA.length+1];
            //if(occontmp.length>0)
            CopiarArregloCon(oclientesconCA,occontmp);
            //oagentes=CopiarArregloCon(occontmp);

            if((oclientesconCA.length-1)<0)
            {
                nindice=0;
            }
            else
            {
                nindice=(oclientesconCA.length-1);
            }

            oclientesconCA[nindice]= new caClientesCon(onuevoskt,this,olog,Huella,Rostro);
            oclientesconCA[nindice].setRangoHuella(ninicioHuella, nfinalHuella);//Strail 1feb2012
            oclientesconCA[nindice].setRangoRostro(ninicioRostro, nfinalRostro);//Strail 1feb2012
            oclientesconCA[nindice].setLlave(nagentesllave);
            oclientesconCA[nindice].start();
            
            //ncontadorclientes++;
            nagentesllave++;
        }catch(Exception err)
        {
            olog.outMensaje("caServidor.activarConexionCliente() ERROR :" + err.getMessage());
        }
        
    }
    
    @Override
    public synchronized void QuieroSalir(int ncual)
    {
        int z=0;
        int i=0;
        //Al fin no entendi por que putas va con -1
        //oagentesTMP = new cIfxClientesCon[oclientesconCA.length-1];
        try
        {
        olog.outMensaje("caServidor.QuieroSalir(): Tamaño arreglo : "+oclientesconCA.length);

        
        oagentesTMPCA = new caClientesCon[oclientesconCA.length-1];
        
        for(i=0; i<oclientesconCA.length;i++)    
        {
            if( oclientesconCA[i].getLlave() != ncual)
            {
                oagentesTMPCA[z] = oclientesconCA[i];
                z++;
                
            }
            
        }
        oclientesconCA= new caClientesCon[oagentesTMPCA.length];
        
        CopiarArregloCon(oclientesconCA,oagentesTMPCA); 
        }
        catch(Exception err)
        {
            olog.outMensaje("caServidor.QuieroSalir(): ERROR : "+err.toString());
            //olog.outMensaje("cIfxServidor.QuieroSalir(): ERROR : "+err.getMessage());
            olog.outMensaje("caServidor.QuieroSalir(): Tamaño arreglo : "+oclientesconCA.length);
            olog.outMensaje("caServidor.QuieroSalir(): (i) : "+i);
            olog.outMensaje("caServidor.QuieroSalir(): (z) : "+z);
            olog.outMensaje("caServidor.QuieroSalir(): ERROR DETALLE : "+err.getMessage());
        }
        
    }
        
    public synchronized void CopiarArregloCon(caClientesCon[] destino,caClientesCon[] origen)
    {
        //cIfxClientesCon occtmp[] = new cIfxClientesCon[occon.length];
        System.arraycopy(origen, 0, destino, 0, origen.length);
    
    }
        
}
